Dashboard Temp Share Shortlinks Frames API

HTMLify

381. Insert Delete GetRandom O(1) - Duplicates allowed.java
Views: 1 | Author: cody
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 381. Insert Delete GetRandom O(1) - Duplicates allowed
class RandomizedCollection {
    HashMap<Integer,HashSet<Integer>> map;
    ArrayList<Integer> list;
    Random r;
    public RandomizedCollection() {
        map = new HashMap<>();
        list = new ArrayList<>();
        r = new Random();
    }
    
    public boolean insert(int val) {
        HashSet<Integer> set;
        boolean flag;
        if(map.containsKey(val)){
            set = map.get(val);
            flag = false;
        } else {
            set = new HashSet<>();
            flag = true;
        }
        set.add(list.size());
        map.put(val,set);
        list.add(val);
        return flag;
    }
    
    public boolean remove(int val) {
        HashSet<Integer> set;
        if(map.containsKey(val)==true){
            set = map.get(val);
        } else {
            return false;
        }
        int remidx = -1;
        for(int x : set){
            remidx = x;
            break;
        }
        set.remove(remidx);
        map.put(val,set);
        if(remidx == list.size()-1){
            list.remove(list.size()-1);
        }else{
            int idx2 = list.size()-1;
            int temp = list.get(idx2);
            swap(remidx,idx2);
            list.remove(list.size()-1);
            HashSet<Integer> s = map.get(temp);
            s.remove(idx2);
            s.add(remidx);
            map.put(temp,s);
        }
        if(map.get(val).size()==0){
            map.remove(val);
        }
        return true;
    }
    
    public int getRandom() {
        int idx = r.nextInt(list.size());
        return list.get(idx);
    }
      public void swap(int i,int j){
        int a = list.get(i);
        int b = list.get(j);
        list.set(i,b);
        list.set(j,a);
    }
}